package com.qf.business.coupon.service.impl;

import cn.hutool.core.map.MapUtil;
import com.qf.business.coupon.service.CoupomTemplateService;
import com.qf.commons.web.exception.ServiceException;
import com.qf.entity.base.Codes;
import com.qf.entity.po.CouponTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class CoupomTemplateServiceImpl implements CoupomTemplateService {

    @Autowired
    private MongoTemplate mongoTemplate;

    /**
     * 新增优惠券模板
     * @param couponTemplate
     * @return
     */
    @Override
    public int save(CouponTemplate couponTemplate) {
        //查询当前的模板名称，如果存在则不能重复添加
        CouponTemplate templateName = mongoTemplate.findOne(
                new Query(Criteria.where("templateName").is(couponTemplate.getTemplateName())),
                CouponTemplate.class);

        if (templateName != null) {
            //如果模板已经存在，则抛出异常
            throw new ServiceException(Codes.FAIL);
        }

        mongoTemplate.insert(couponTemplate);
        return 1;
    }

    /**
     * 查询模板列表
     * @return
     */
    @Override
    public Map<String, List<CouponTemplate>> list() {

        List<CouponTemplate> templates = mongoTemplate.findAll(CouponTemplate.class);

        //将模板列表拆分成两个集合
        //使用限制的模板集合
        List<CouponTemplate> limits = new ArrayList<>();
        //优惠规则的模板集合
        List<CouponTemplate> rules = new ArrayList<>();

        for (CouponTemplate template : templates) {
            if (template.getTemplateType() == 0) {
                limits.add(template);
            } else {
                rules.add(template);
            }
        }

        return MapUtil.builder(new HashMap<String, List<CouponTemplate>>())
                .put("limits", limits)
                .put("rules", rules)
                .build();
    }
}
